{
 "cells": [
  {
   "metadata": {
    "collapsed": true
   },
   "cell_type": "markdown",
   "source": [
    "#### Retrieval流程\n",
    "    流程：Source -> Load -> Transform -> Embed -> Store -> Retrieve\n",
    "\n",
    "##### 环节1：Source(数据源)\n",
    "指的是RAG架构中所外挂的知识库，这里有三点说明：\n",
    "    1、原始数据源类型多样：如视频、图片、文本、代码、文档等\n",
    "    2、形式多样性：\n",
    "        a、可以是上百个.csv文件，可以是上千个.json文件，也可以是上万个.pdf文件\n",
    "        b、可以是某一个业务流程外放的api，可以是某个网站的实时数据等\n",
    "\n",
    "##### 环节2：Load(加载)\n",
    "文档加载器(Document Loaders)负责将来自不同数据源的非结构化文本，加载到内存，成为文档(Document)对象。\n",
    "文档对象包含文档内容和相关元数据信息，例如txt、csv、html、json、markdown、pdf甚至视频等。\n",
    "文档加载器还支持\"延迟加载\"模式，以环节处理大文件时的内存压力。\n",
    "\n",
    "##### 环节3：Transform(转换)\n",
    "文档转换器(Document Transformers)负责对加载的文档进行转换和处理，以便更好的适应下游任务的需求。\n",
    "文档转换器提供了一致的接口(工具)来操作文档，主要包括以下几类：\n",
    "    文档拆分器(Text Splitters)：将长文本拆分成语义上的小块，以适应语言模型的上下文窗口限制。\n",
    "    冗余过滤器(Redundancy Filters)：识别并过滤重复的文档。\n",
    "    元数据提取器(Metadata Extractors)：从文档中提取标题、语调等结构化元数据。\n",
    "    对话转换器(Conversational Transformers)：将非结构化对话转换成问答格式的文档。\n",
    "\n",
    "##### 环节3.1：Text Splitting(文档拆分)\n",
    "    拆分/分块的必要性：前一个环节加载后的文档对象可以直接传入文档拆分器进行拆分，而文档切块后才能向量化并存入数据库。\n",
    "    文档拆分器的多样性：LangChain提供了丰富的文档拆分器，不仅能够切分普通文本，还能切分Markdown、Json、Html、代码等特殊格式的文本。\n",
    "    拆分/分块的挑战性：实际拆分操作中需要处理许多细节问题，不同类型的文本、不同的使用场景都需要采用不同的分块策略。\n",
    "        1、可以按照数据类型进行切片处理，比如针对文本类数据，可以直接按照字符、段落进行切片，代码类数据则需要进一步细分以保证代码的功能性。\n",
    "        2、可以直接根据token进行切片处理\n",
    "\n",
    "    在构建RAG应用程序的整个流程中，拆分/分块是最具挑战性的环节之一，它显著影响检索效果。目前还没有通用的方法可以明确指出哪一种分块策略最有效。\n",
    "    不同的使用场景和数据类型都会影响分块策略的选择。\n",
    "\n",
    "##### 环节4：Embed(嵌入)\n",
    "    文档嵌入模型(Text Embedding Models)负责将文本转换为向量表示，即模型赋予了文本计算机可理解的数值表示，使文本可用于向量空间中的各种运算，\n",
    "    大大扩展了文本分析的可能性，是自然语言处理领域非常重要的技术。\n",
    "    实现原理：通过特定算法(如Word2Vec)将语义信息编码为固定维度的向量。\n",
    "    关键特性：相似的词在向量空间中距离相近，例如\"猫\"和\"犬\"的向量夹角小于\"猫\"和\"汽车\"。\n",
    "    文本嵌入为LangChain中的问答、检索、推荐等功能提供了重要支持，具体为：\n",
    "        语义匹配：通过计算两个文本的向量余弦相似度，判断它们在语义上的相似程度，实现语义匹配。\n",
    "        文本检索：通过计算不同文本之间的向量相似度，可以实现语义搜索，找到向量空间中最相似的文本。\n",
    "        信息推荐：根据用户的历史记录或兴趣爱安茹生成用户向量，计算不同信息的向量与用户向量的相似度，推荐相似的信息。\n",
    "        知识挖掘：可以通过聚类、降维等手段分析文本向量的分布，发现文本之间的潜在关联，挖掘知识。\n",
    "        自然语言处理：将词语、句子等表示为稠密向量，为神经网络等下游任务提供输入。\n",
    "\n",
    "##### 环节5：Store(存储)\n",
    "    LangChain还支持把文本嵌入存储到向量存储或临时缓存，以避免需要重新计算它们。这就出现了数据库，支持这些嵌入的高校存储和搜索需求。\n",
    "\n",
    "##### 环节6：Retrieve(检索)\n",
    "    检索器(Retrievers)是一种用于相应非结构化查询的接口，它可以返回符合查询要求的文档。\n",
    "    LangChain提供了一些常用的检索器，如向量检索器、文档检索器、网站研究检索器等。\n",
    "    通过配置不同的检索器，LangChain可以灵活地平衡检索的精度、召回率和效率。检索结果将为后续的问答生成提供信息支持，以产生更加准确和完整的回答。"
   ],
   "id": "3cfa0298f49c830"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
